package sr.myserver.config;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import sr.myserver.vo.Login;
import sr.myserver.commons.Constants;

import java.util.Date;

/**
 * jwt token管理
 *
 * @author sirui
 */
@Slf4j
public class JwtConfig {
    public static final String CLIENT_TYPE = "clientType";
    public static final String ROLES = "role";

    /**
     * 创建token
     *
     * @param entity 登录信息
     * @param role   储存权限信息
     * @return
     */
    public static String create(Login.Request entity, String role) {
        return Jwts.builder().setSubject(entity.getUserId())
                .setIssuedAt(new Date()).claim(ROLES, role).claim(CLIENT_TYPE, entity.getClientType())
                .signWith(SignatureAlgorithm.HS256, Constants.SECRET_KEY).compact();
    }

    /**
     * 刷新token
     *
     * @param claims 原token信息对象
     * @return 新token信息
     */
    public static String refresh(Claims claims) {
        return Jwts.builder().setSubject(claims.getSubject()).setIssuedAt(new Date())
                .claim("role", claims.get("role")).claim(CLIENT_TYPE, claims.get(CLIENT_TYPE))
                .signWith(SignatureAlgorithm.HS256, Constants.SECRET_KEY).compact();
    }

    /**
     * token串读取对象
     *
     * @param token token信息
     * @return 结果对象
     */
    public static Claims thinning(String token) {
        return Jwts.parser().setSigningKey(Constants.SECRET_KEY).parseClaimsJws(token).getBody();
    }

    /**
     * 获取token中用户编号
     *
     * @param token token信息
     * @return 用户编号
     */
    public static String getUserId(String token) {
        return thinning(token).getSubject();
    }

    /**
     * 获取token中用户编号
     *
     * @param claims token对象
     * @return 用户编号
     */
    public static String getUserId(Claims claims) {
        return claims.getSubject();
    }

    /**
     * 获取token中权限编号
     *
     * @param claims token对象
     * @return 权限编号
     */
    public static String getRoleId(Claims claims) {
        return claims.get(ROLES, String.class);
    }

    /**
     * 获取token中权限编号
     *
     * @param token token信息
     * @return 权限编号
     */
    public static String getRoleId(String token) {
        return thinning(token).get(ROLES, String.class);
    }
}